package com.chushouya.product.service.api.impl;

import com.general.framework.core.lang.Beans;
import com.general.framework.core.lang.Dates;
import com.general.framework.core.schema.PageResult;
import com.chushouya.product.dao.entity.EvaluateLogEntity;
import com.chushouya.product.dao.repository.EvaluateLogRepository;
import com.chushouya.product.dto.admin.evaluatelog.EvaluateLogQuery;
import com.chushouya.product.dto.api.product.ProductApiQuery;
import com.chushouya.product.dto.api.product.ProductListApiDTO;
import com.chushouya.product.service.api.ProductHotApiService;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.*;
import java.util.stream.Collectors;

@Service
public class ProductHotApiServiceImpl implements ProductHotApiService {

    @Resource
    private EvaluateLogRepository evaluateLogRepository;


    @Override
    public List<ProductListApiDTO> hotProductList(ProductApiQuery query) {
        final Integer size = query.getSize() != null ? query.getSize() : 10;
        
        // 1. 查询评价日志数据
        List<EvaluateLogEntity> evaluateLogs = queryEvaluateLogs(query);
        if (evaluateLogs == null || evaluateLogs.isEmpty()) {
            return Collections.emptyList();
        }
        
        // 2. 统计商品热度
        Map<Long, ProductStats> productStatsMap = calculateProductStats(evaluateLogs);
        
        // 3. 排序并获取热门商品
        List<ProductStats> hotProducts = getTopHotProducts(productStatsMap, size);
        
        // 4. 转换为API响应格式
        return convertToApiDTOs(hotProducts);
    }
    
    /**
     * 查询评价日志数据
     */
    private List<EvaluateLogEntity> queryEvaluateLogs(ProductApiQuery query) {
        EvaluateLogQuery evaluateLogQuery = Beans.copy(query, EvaluateLogQuery.class);
        evaluateLogQuery.setSize(1000); // 增大查询范围以获取更多数据
        evaluateLogQuery.setStartTime(Dates.addDays(Dates.getTimeNow(), -7)); // 最近7天
        
        PageResult<EvaluateLogEntity> evaluatePageResult = evaluateLogRepository.selectPageResult(evaluateLogQuery);
        return evaluatePageResult.getRows();
    }
    
    /**
     * 统计商品热度数据
     */
    private Map<Long, ProductStats> calculateProductStats(List<EvaluateLogEntity> evaluateLogs) {
        Map<Long, ProductStats> productStatsMap = new HashMap<>();
        
        for (EvaluateLogEntity log : evaluateLogs) {
            Long productId = log.getProductId();
            if (productId == null) {
                continue;
            }
            
            ProductStats stats = productStatsMap.computeIfAbsent(productId, k -> new ProductStats());
            updateProductStats(stats, log);
        }
        
        return productStatsMap;
    }
    
    /**
     * 更新商品统计信息
     */
    private void updateProductStats(ProductStats stats, EvaluateLogEntity log) {
        stats.productId = log.getProductId();
        stats.productName = log.getProductName();
        stats.productImage = log.getProductImage();
        stats.count++;
        
        // 更新最高价格
        if (log.getEvaluatePrice() != null) {
            if (stats.maxPrice == null || log.getEvaluatePrice().compareTo(stats.maxPrice) > 0) {
                stats.maxPrice = log.getEvaluatePrice();
            }
        }
    }
    
    /**
     * 获取热门商品排行榜
     */
    private List<ProductStats> getTopHotProducts(Map<Long, ProductStats> productStatsMap, Integer size) {
        return productStatsMap.values().stream()
                .sorted((a, b) -> Integer.compare(b.count, a.count)) // 按出现次数降序排列
                .limit(size)
                .collect(Collectors.toList());
    }
    
    /**
     * 转换为API响应格式
     */
    private List<ProductListApiDTO> convertToApiDTOs(List<ProductStats> hotProducts) {
        List<ProductListApiDTO> result = new ArrayList<>();
        
        for (ProductStats stats : hotProducts) {
            ProductListApiDTO dto = createProductApiDTO(stats);
            result.add(dto);
        }
        
        return result;
    }
    
    /**
     * 创建商品API DTO
     */
    private ProductListApiDTO createProductApiDTO(ProductStats stats) {
        ProductListApiDTO dto = new ProductListApiDTO();
        dto.setProductId(stats.productId);
        dto.setProductName(stats.productName);
        dto.setProductImage(stats.productImage);
        
        // 设置最高评估价格
        if (stats.maxPrice != null) {
            dto.setMaxPrice(stats.maxPrice);
        }
        
        return dto;
    }
    
    /**
     * 商品统计信息内部类
     */
    private static class ProductStats {
        Long productId;
        String productName;
        String productImage;
        int count = 0;
        java.math.BigDecimal maxPrice = null;
    }
}
